/**
 * 七：函数概念
 *  1、普通函数
 *  2、箭头函数
 *  3、高阶函数
 *  4、函数this指向问题
 *  5、闭包
 *  6、generator函数
 */

/**
 * 1、普通函数
 */
function fun() { 
    console.log("普通函数")
}
/**
 * 2、箭头函数
 */
const fn = (n,m) => { 
    console.log("箭头函数")
}
/**
 * 3、高阶函数（）Higher-order function
 *   概念：JavaScript的函数其实都指向某个变量。
 *         既然变量可以指向函数，函数的参数能接收变量，那么一个函数就可以接收另一个函数作为参数，
 *         这种函数就称之为高阶函数。
 *   常见的高阶函数：
 *      对于数组，除了map()、reduce、filter()、sort()这些方法可以传入一个函数外，Array对象还提供了很多非常实用的高阶函数。
 */
const f = Math.abs
function higherOrder(x, y, f) { 
    return f(x) + f(y)
}

console.log("高阶函数：", higherOrder(0.1, 0.56, f)) //高阶函数： 0.66

/**
 * 5、闭包
 *    （1）概念：把函数作为返回值的函数
 *    （2）特点：
 *             ①函数嵌套函数
               ②函数内部可以引用函数外部的参数和变量
               ③参数和变量不会被垃圾回收机制回收
 *    （3）作用：缓存局部变量，而不会被内存释放
 *    （4）优缺点：
           4.1、好处：
               ①保护函数内的变量安全 ，实现封装，防止变量流入其他环境发生命名冲突
               ②在内存中维持一个变量，可以做缓存（但使用多了同时也是一项缺点，消耗内存）
               ③匿名自执行函数可以减少内存消耗
           4.2、坏处
               ①其中一点上面已经有体现了，就是被引用的私有变量不能被销毁，增大了内存消耗，造成内存泄漏。
                    解决方法是可以在使用完变量后手动为它赋值为null；
               ②其次由于闭包涉及跨域访问，所以会导致性能损失。
                    我们可以通过把跨作用域变量存储在局部变量中，然后直接访问局部变量，来减轻对执行速度的影响
 *    （5）形成原因：
 */
function sum(arr) {
    return arr.reduce(function (x, y) {
        return x + y;
    });
}

console.log(sum([1, 2, 3, 4, 5])); // 15